//购买两块巧克力
/*给你一个整数数组 prices ，它表示一个商店里若干巧克力的价格。同时给你一个整数 money ，表示你一开始拥有的钱数。

你必须购买 恰好 两块巧克力，而且剩余的钱数必须是 非负数 。同时你想最小化购买两块巧克力的总花费。

请你返回在购买两块巧克力后，最多能剩下多少钱。如果购买任意两块巧克力都超过了你拥有的钱，请你返回 money 。注意剩余钱数必须是非负数。
2 <= prices.length <= 50
1 <= prices[i] <= 100
1 <= money <= 100
*/
int compare(const void* q1, const void* q2) {
    return (*((int*)(q1)) - *((int*)(q2)));
}
int buyChoco(int* prices, int pricesSize, int money) {
    qsort(prices, pricesSize, sizeof(int), compare);
    return money - prices[0] - prices[1] >= 0 ? money - prices[0] - prices[1]
                                              : money;
}


// 矩阵中的幸运数
/*给你一个 m x n 的矩阵，矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。

幸运数 是指矩阵中满足同时下列两个条件的元素：

在同一行的所有元素中最小
在同一列的所有元素中最大
 m == mat.length
n == mat[i].length
1 <= n, m <= 50
1 <= matrix[i][j] <= 105
矩阵中的所有元素都是不同的
*/
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* luckyNumbers(int** matrix, int matrixSize, int* matrixColSize,
                  int* returnSize) {
    int _max = matrixSize > matrixColSize[0] ? matrixSize : matrixColSize[0];
    int* lucky_nums = (int*)malloc(sizeof(int) * (_max));
    int* row_min_nums = (int*)malloc(sizeof(int) * matrixSize);
    for (int i = 0; i < matrixSize; i++) {
        row_min_nums[i] = 100001;
    }
    int* col_max_nums = (int*)calloc(matrixColSize[0], sizeof(int));
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixColSize[i]; j++) {
            if (matrix[i][j] < row_min_nums[i])
                row_min_nums[i] = matrix[i][j];
            if (matrix[i][j] > col_max_nums[j])
                col_max_nums[j] = matrix[i][j];
        }
    }
    int hash[100001] = {0};
    int lucky_nums_size = 0;
    for (int i = 0; i < matrixSize; i++) {
        hash[row_min_nums[i]]++;
    }
    for (int i = 0; i < matrixColSize[0]; i++) {
        hash[col_max_nums[i]]--;
        if (hash[col_max_nums[i]] == 0) {
            lucky_nums[lucky_nums_size++] = col_max_nums[i];
        }
    }
    *returnSize = lucky_nums_size;
    return lucky_nums;
}